0%

视频理解论文串讲——终(跟着李沐学ai视频)笔记

TimeSformer


这篇文章是将Transformer正式引入视频领域的实验性论文。众所周知,Transformer在图像与视频领域上的应用难点在于无法将整个视频或图片丢给transformer进行训练,那么实验的重点就在于怎么减小计算量,关于这点,最有启发性的无非是R(2+1)D的那篇文献,事实上本篇文章的改进重点就在于将Transfomers通过分开做时间维度和空间维度的方法来进行判别。

本篇文章是一个实验性的文章,结论也是很可观的,对于视频理解任务来说,Transformer能够很好的工作。那首先就看看作者提出了哪些框架:

混合模式

图1.几种值得尝试与对比的框架

这几种框架简单易懂,就不多解释了,要想深入理解还得看看接下来这张图:

混合模式

图2.框架对应的原理图

来简单解释一下这张图:

  • Space Attention,对于选定patch(图中蓝色像素块),仅计算与当前帧中其余patch(图中红色像素块)的相似度
  • Joint Space-Time Attention,对选定patch,计算与前后以及当前帧的所有patch的相似度
  • Divided Space-Time Attention,对选定patch,计算与当前帧所有patch(图中红色像素块)的相似度,之后计算与前后帧相同位置patch(图中绿色像素块)的相似度
  • Sparse Local Global Attention,对选定patch,先计算与该patch位置附近前后以及当前时间帧patch的相似度(图中黄色像素块),之后与随机选取部分的前后当前帧的patch(图中紫色像素块)计算相似度
  • Axial Attention,对选定patch,计算与patch所在位置同行同列的当前时间帧patch(图中黄色与紫色像素块),再计算与对应位置前后时间帧patch(图中绿色像素点)的相似度

直接上结果吧,不出意外的,是Divided Space-Time Attention的效果最好:

混合模式

图3.框架实验结果

那为了免去回忆attention的步骤,也为了我自己回顾一次,这里接下来说说具体怎么做的,由于第一次介绍这种大型结构,因此 大量公式与细节警告!

论文细节部分


数据预处理部分

  • Input clip,从原始视频中,将需要训练的数据剪辑出来,形式化表达为 $X\in \R ^{H \times W\times 3\times F}$。

  • Decomposition into patches,根据ViT那篇论文的方法,将视频的每一帧都切割成若干小块(如图3),形式化表达一下,那就是对于 $t$ 时间上的一帧 $x_t\in X$,将其切成 $P\times P$个小块,将这些小块拉直后,每一RGB帧都可表示为 $x_{p,t}\in \R^{3P^2}, p=1,…,N;t=1,…,F$。这里说明一下,拉直是为了接下来我们能直接用四维张量进行直接运算,并且方便我们进行位置编码。

Linear embedding(位置编码)

这里作者使用了最简单的可学习线性映射编码,这是根据bert的论文来决定的,目前来说绝对位置编码与可学习位置编码的差异不大,但是大多数论文好像普遍认为再模型趋于庞大的时候,让模型自己学习位置编码是更好的选择,只能说有待研究。那么直接给出线性编码的形式化表达:

这里, $E\in \R ^{D\times 3P^2}$,$z^0_{p,t}\in \R^D$,这个$D$的确定有一点歧义

这个公式的含义就是将一个patch编码到向量 $z^0_{p,t}$ 上,Transformer是会堆叠好几个自注意力模块的,因此这个上标0的表示目前这个编码处于模型的最开始阶段,$e^{pos}$ 是编码每个patch的空间位置的可学习向量,这个向量的含义就是定位每个patch的位置,$E$ 也是一个可学习矩阵,它将 $x_{p,t}$ 进行一个线性映射。

emmmm,好吧,这确实很令人无法理解为什么这么干,让我们换个角度解读,整个公式实际上就是一层去除了非线性结构(激发函数)的全连接层,毕竟位置信息我们总是希望是线性的,引入非线性结构就容易学到奇怪的东西,$E$ 更像学习了一种位置的相对关系,而 $e^{pos}$ 则决定了输入的各个patch之间的绝对位置,这样的学习有助于模型同时捕获相对位置与绝对位置。

上述纯属个人猜想,因为实际在小模型情况下,直接使用三角函数编码与可学习编码的实际效果没有太大差别。

好,这是论文上面给出的方法,但我在查阅代码的时候发现作者用了一个等价操作去替代这些数学运算, 以上的从划分patch到$Ex_{p,t}$的部分 实际等价于一个核大小为$P$,步长为$P$,输入通道为3(针对一帧RGB帧来说),输出通道为$D$(这个 $D$ 应该理解为一种编码特征数,方便之后用于多头注意力机制)的卷积操作,可以看这段代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class PatchEmbed(nn.Module):
""" Image to Patch Embedding
"""
def __init__(self, img_size=224, patch_size=16, in_chans=3, embed_dim=768):
super().__init__()
img_size = to_2tuple(img_size)
patch_size = to_2tuple(patch_size)
num_patches = (img_size[1] // patch_size[1]) * (img_size[0] // patch_size[0])
self.img_size = img_size
self.patch_size = patch_size
self.num_patches = num_patches

self.proj = nn.Conv2d(in_chans, embed_dim, kernel_size=patch_size, stride=patch_size)

def forward(self, x):
B, C, T, H, W = x.shape # B为一次传入的batch_size,C为通道数量,T为帧数(Time),H与W为宽与高
x = rearrange(x, 'b c t h w -> (b t) c h w') # 将视频的batch方向和时间方向合并,并转置成需要的样子
x = self.proj(x)
W = x.size(-1)
x = x.flatten(2).transpose(1, 2) # 这地方有点离谱,transpose在输入两个的情况下无论顺序必定改变
return x, T, W

那之后图像patch就一步到位的编码完成,只需要加上 $e^{pos}_{p,t}$ 即可,这里注意一下,我们需要再空间上加一次,时间上也加一次,作者在源码中是将两次分开做的。

这里还有一个细节,在VIT中,针对视频分类任务是需要嵌入一个分类向量的,在这里,同样也要嵌入一个 $z^0_{0,0}$ 作为我们的分类向量使用,请注意,就是这个东西,导致接下来的公式和以往不太一样了。

Query-Key-Value computation

这部分就是经典的自注意力机制了,简单说就是人为不好给注意力机制需要的Query-Key-Value三个参数,不如全交给模型自己算就好了。那么它的定义公式为:

这里的$LN(\cdot)$表示LayerNorm。$a=1,…,A$,表示多头自注意力的数量,$l$ 表示当前是网络的第几层。这里的 $D_h=D/A$ 就是决定一个注意力头输入多少通道的数据了(这里的通道不再是RGB的3个,而是我们设定的编码特征)。

Self-attention computation

该部分计算我们以第一个patch,第一帧为例进行原理说明,具体的当然要看代码才能理解得比较深刻。

首先计算自注意力权重 $\alpha^{l,a}_{p,t}\in^{N(F+1)}$(这里的 $t=0,1,…,F$ 所以 $F$ 需要加1,第一帧通常是不参与后续计算的,只是作为一个冷启动的条件):

这里的 $k^{l,a}_{0,0}$ 就是 $z^{l,a}_{0,0}$ 对应的Key向量,$k^{l,a}_{0,0}\{ k^{l,a}_{p’,t’} \}$ 并非矩阵乘法,而是拼接的意思。还记得前面说过的,这篇论文提出了5种对比patch相似度的方法,那自然在公式这方面就要做对应的改进了,上述公式实际上就是在对比所有时间帧上的所有patch。这里为了对比理解,论文给出了一个仅对比空间patch的公式变种:

可以看到,最大的差别就在于不用对比时间了。

Ecoding

接下来就是编码部分,上述计算得到的是注意力权重,根据VIT原论文的公式,进行一点时间方向上的魔改扩展,就可以计算自注意力系数,请注意,接下来的计算公式,全都基于Joint Space-Time Attention(全时空连接注意力)方法:

ok,原论文的表达是这样的:

混合模式

图4.一个神奇的表达

这也困扰我很久,但是查阅源码后发现,这个意思居然和上面的公式一个意思,也就是说,作者只是为了让我们区分分类向量和输入向量,所以特意把分类向量对应的 $\alpha ,v$ 给拆出来写了。

那接下来就正常多了,不就是全程残差连接加各头注意力机制线性混合一次最后加上一层MLP嘛,用公式表达如下:

如果最后要做的是分类任务的话,那直接就对最后一层的分类向量做一次标准化就可以了:

Space-Time Self-Attention Models

事情到这还没完,别忘了论文中有一个目标是做时空分离的注意力机制,因此我们距离了空间的公式,时间上的公式还没给出,对(3)式稍作修改即可:

这里在做时空分离注意力机制的时候一定要注意另一个细节,空间与时间的注意力权重是不共享的,因此实际上我们要训练两套矩阵,分别是 $\{ W^{(l,a)}_{Q^{time}}, W^{(l,a)}_{K^{time}}, W^{(l,a)}_{V^{time}} \}$ 以及 $\{ W^{(l,a)}_{Q^{space}}, W^{(l,a)}_{K^{space}}, W^{(l,a)}_{V^{space}} \}$。

结论

这是一篇实验性质的的文章,但最后的效果也确实不错,很好的为transfomer在视频领域的工作打下了基石:分开做时间和空间的注意力。这也算给出一个标准答案了。

视频理解论文串讲——下二(跟着李沐学ai视频)笔记

R(2+1)D方法


本篇论文提出一种介于2D卷积与3D卷积之间的卷积操作:R(2+1)D卷积。这个操作将ResNet网络思想引入了卷积网络,并设计了多个消融实验证明了该操作的有效性与优越性。

在之前的工作中,3D卷积取得了很好的效果,那么作者就想到2D与3D卷积之间能否混起来用?又或者,能否找到一种介于2D卷积与3D卷积之间的操作,这样的话,就能解决两个问题:第一就是3D卷积参数量过大,难以训练。第二就是2D卷积不能很好的捕捉时间信息。若是能够双方优势互补,那么性能肯定能够提升,为此,作者提出了一种混合卷积与一种R(2+1)D的操作。

那首先介绍一下什么是 (2+1)D 卷积,如下图

混合模式

图1.3D卷积核与(2+1)D卷积操作的对比

  • 完整3D卷积(Full 3D convolution)使用 $t\times d\times d$ 的卷积核进行卷积,那么一个卷积核中的就有 $t\times d\times d$ 各不同的参数,并且时间与空间信息是一起学习的
  • (2+1)D卷积核将卷积操作分为两步来做,首先使用 $1 \times d \times d$ 的卷积核提取空间特征,在提取完毕的特征上再使用 $t \times 1 \times 1$ 的卷积核提取时间信息

有意思的是这个操作出乎意外地符合直觉——我们总是先看到图像,再注意时序上的变化。而且这个操作其实带来了一个很好的特性:我们能够在大型图像数据库上预训练能够提取语义信息的2D卷积核参数。这样能大大减少训练的时间。此外,这个操作将原来的一次非线性变换(激发函数)变成了两次,这使得模型的非线性建模能力得到了提升。

这个操作还能够优化3D卷积的参数量,3D核总共需要有 $t\times d \times d$个参数,而(2+1)D只需要 $d\times d+t$ 个参数即可。

那这个操作是否有效?作者考虑了几种网络的设计框架。实验了全2D卷积,全3D卷积,2D+3D卷积以及全(2+1)D卷积的结构,如下图所示:

混合模式

图2.几种Res网络结构对比

  • 其中MC$x$代表带有 $x$ 层卷积层的混合卷积网络架构,rMC$x$ 表示倒转的 $x$ 层混合卷积层

混合模式

图3.几种网络结构的性能对比

那么不出所料地是E(2+1)D的效果最好,并且在参数量上较之R3D也少了1000w个。那么R(2+1)D与R3D是否有联系?

作者也给出了相关的解释:R3D可以被R(2+1)D进行拟合逼近。考虑到这两个卷积核最大的区别在于参数的数量上,那么对于 $N_i$ 个 $t\times d\times d$ 个3D卷积核,可以使用 $N_{i-1}\times 1\times d\times d$ 个2D卷积核与 $N_{i-1}$ 个 $M_i \times t \times 1 \times 1$ 个时间卷积核进行逼近,这实际上就相当于啊一个3D卷积核拆成了先空间卷积,再进行时间卷积,那么为了保证这两种操作方式的参数量抑制,作者选择了

虽然看上去很诡异,但是这一切的操作都是为了使得R(2+1)D卷积核的参数尽可能的逼近R3D卷积核的参数。

混合模式

图4.相同参数量上R3D与R(2+1)D对比

那么经过这一顿操作,在相同数量的参数上,R(2+1)D操作能够明显提升模型的收敛速度与性能,这也证明了,分开学习时间与空间的效果是能够更好的。

作者在论文中还尝试了很多工作,包括将这个操作移植到一些经典的网络框架上,去和经典框架做对比,其对比结果如下图:

混合模式

图5.与经典网络框架的对比

那实际上,这个方法的效果还是没有使用I3D的双流网络架构好的,虽然作者认为它们不分上下,而且I3D还有一个Kinetics数据集进行辅助预训练,但那显然是作者嘴硬,只能说I3D+双流网络的框架还是更加优秀。但这个想法本身是很好的,提供了时序建模的一种全新思路。

视频理解论文串讲——下一(跟着李沐学ai视频)笔记

Non-local Neural Networks


这篇论文带来的改变比较重要,因此会花较多的时间来整理相关工作,Let’s do it!

论文开篇提出,当今卷积工作与常用操作对图像的处理都是局部性的(local neighborhood),无论在空间上还是在时间上,要想通过这些操作捕捉全局信息都需要重复这些操作(比如卷积核的移动,LSTM的逐帧输入等),那最大的问题就是没办法跨越区域进行建模。

那这就是这篇文章想解决的一个主要问题,作者提出一种用于捕获深度网络长程依赖的非局部的运算方式(non-local),并且这种运算方式被作者打包为了一个模型组件,即插即用,就和卷积层一样。

这个non-local操作的灵感来源于图像处理中的non-local means滤波算法,这个算法的基本思想是寻找与 $i$ 位置相似的像素点,对所有相似的像素点进行加权平均后将输出值作为 $i$ 位置的像素值。

而non-local操作则是认为:在视频或图像领域对某像素点 $x_i$ 进行编码的时候,不仅要考虑周围位置 $x_{i+\Delta i}$ 的影响,还要考虑到全局有可能对 $x_i$ 产生影响的位置 $x_j$ ,例如下图:

混合模式

图1.非局部化思想

作者给出了这种思想的形式化描述:

公式 $(1)$ 中的 $f(x_i,x_j)$ 计算 $x_i$ 与所有可能位置 $x_j$ 的相似度,$g(x_j)$ 则为一个编码函数,负责将 $j$ 位置的像素值编码为特征,而 $C(x)$ 则是一个正则化函数

作者解释了这个操作与传统卷积,RNN操作有哪些不同点。卷积的感受野是有限的,而RNN操作往往只考虑最新的信息或者是最近的信息,也就是这两种操作都只考虑了 $x_i$ 的领域位置,没能捕捉到跨区域有可能与 $x_i$ 有关的像素点。卷积操作本质上就是对邻域进行加权平均求和,RNN忽略了远离 $x_i$ 的像素点

作者又认为这个操作与fc操作也是很不同的,虽然fc操作读入了所有像素点,并且在像素点上也能够进行全局的数据交换,但最终的输出是基于权重的,而non-local是通过计算相似度来输出编码特征。不仅如此,fc层会丢失掉位置信息,输入的大小也是固定的。

前面也说到,这个模块即插即用,从形式化上看,模块输出与输入的形状是相同的,这就有个很好的性质,它可以在任意阶段插入使用。

搞明白了为什么这个操作要这么做,接下来讨论如何选取合适的 $f$ 与 $g$ 要注意的是作者发现怎么选其实改进差的不是特别多,所以这个操作有效的主要原因不是具体的怎么计算,而是捕捉到了非局部的特征。

这里作者给出了好几个公式,但这些公式不过是余弦相似度的各种变种而已:

  • 这是non-local mean算法采用的高斯度量函数
  • Embedded Gaussian函数,之所以称为嵌入式就是因为多了两个编码函数 $\theta$ 与 $\phi$,它们对输入进行了一次特征编码(其实就是一次变换)

注意式(3),自注意力机制实际上就是该形式的一个特殊形式,作者发现了这点,并认为non-local与自注意力机制是相通的(这也可以解释为什么自注意力机制输出的聚焦图总是能分散注意在应该注意的位置)

混合模式

图2.自注意力机制示意图

根据上图,可以写出自注意力机制的形式化表达:

那这里就可以看出自注意力中计算相似度的操作就是(3)式的变体(令$\theta (x_i)=x_i^TW^T_{\theta}$,$\phi (x_j)同理$),并且这个式子实际上也是(1)式的一个变体。正因此,non-local操作其实际上可以有多种变体,直接使用自注意力机制来代替计算也具有等同效力

作者又给出了整个算子的形式化表达:

这个公式其实际上就是图二的形式化表达,其中的 $W_z$ 是一个线性变换矩阵,$x_i$ 则是一个short-cut操作,用于防止模型退化

这里还有一个问题那就是输入的是什么,从文章后续做的实验以及它最后的模块化来看,这里的输入应该理解为一个被编码过后的特征。此外这个操作最大的优点就是输入的是什么形状,输出的还是什么形状,这可以让这个模块无缝的嵌入网络而不需要别的操作辅助。

到这里,整篇论文就差不多讲完了,剩下的都是实验部分,作者做了很多的消融实验去对比相似度函数 $f$ 选哪个好,最终得结论是都差不多,当然作者设计的消融实验很有学习价值,这么多的工作让后续的研究者少走了很多弯路

混合模式

图3.消融实验对比

最后的对比也是发现最像自注意力机制的点积操作精确度就够高了,并且高的有限,这也是作者认定性能提升的关键在于non-local,而非相似度函数的操作

之后作者又尝试将这个算子用在一些比较火的模型上,都取得了很好的改进效果,并且对比了单纯时间non-local,单纯空间non-local以及时空混合non-local的效果,那最后的结果不出意外的是时空non-local最好,这也证明了这个算子确实能够捕捉时空上的联系

视频理解论文串讲——下三(跟着李沐学ai视频)笔记

SlowFaste(快慢支网络)


首先给出本篇论文的开篇动机:作者认为对于视频数据,时空方向变化的并非等可能的。如何理解这句话?

这总结了一篇论文:The statistics of natural images。这篇论文统计了众多自然图像数据后得出结论:图像在一阶近似下是各向同性的。人话翻译就是一条纹路的延伸在x方向与y方向是等可能的。但对于时空数据而言,这些数据的分布并非等可能,以动作为例,慢动作的发生可能性总是大于快速动作发生的可能性,因此不能够像处理图像那样等可能的去学习时空数据。

ok,听起来很扯,因为论文接下来干得事基本和上面没关系,空间信息和时间信息不一样是很早前就提出过的了,也因此发展出了双流网络,上述权当作者在讲故事,但是思路很有思考价值,因为确实需要一种方法来区分慢动作与快动作,从生物学上讲,动物的视觉系统也是分开捕捉静态信息与动态信息,因此接下来才是作者真正的研究灵感:对于视频单帧中的纹理,颜色甚至是动作的执行者(比如挥手动作中的手)等信息往往没必要靠多帧识别,随便抽一帧就能看出来了。但是对于动作本身而言,挥手与拍手是具有相同的图像结构信息,但对应的动作是完全不同的,此时需要结合较为连续的图像帧才能明白具体是哪个动作

基于这个想法,作者使用双流网络架构提出了一种快慢网络架构:

混合模式

图1.快慢网络架构

  • 这里的“慢”指的是低帧率采样,对应一个参数量较大的卷积网络,这里采用的是I3D网络架构
  • “快”指的是高帧率采样,对应一个参数量较小的轻量网络
  • 此外这两个网络在提取特征的过程中有跳越链接层负责传递信息

该模型架构中,一条路径被设计用于提取稀疏帧给出的语义信息(如颜色,轮廓等),它以缓慢的速度向前推进。

相反,另一条路径被设计用于捕捉快速变化的动作信息,它被设计成对时间变化敏感(这具体点讲就是不损坏时间信息,不进行时间上的下采样,也不进行时间上的跨步卷积等),对空间建模能力削弱(体现在网络通道数的减少)。

此外两个网络流的主干架构是一致的

这两个网络流是相互融合的,并非自己干自己的事(图一中的连接通道),横向连接的方法有很多,这是一种很流行的技术,可以合并不同级别的空间分辨率和语义。(其实方法就那些,前面的 fusion 操作中讲过不少,这里就不细讲了),在图一模型中,作者并没由采用双向fusion,而是选择单向fusion,这是由实验得到的,两者的效果差别不大,自然选择更轻量的做法。

那么具体来看看这个网络架构的实现方式:

混合模式

图2.快慢网络架构

  1. 网络输入一个64帧的原始剪辑,慢速网络通过16步长的采样输出4帧原始剪辑,同理,快速网络输出一个32帧的原始剪辑
  2. 网络经过一层3D卷积,注意,这里无论是慢速还是快速,在时间层上都是非退化卷积,也就是不改变时间帧的大小
  3. 一层pooling操作,仅缩小图像尺寸
  4. 由于接下来的层都是res模块,仅选取 $res_2$ 层说明,这里的所有时间层上都是非退化的,所以帧数不改变,仅改变图像尺寸,具体模块细节可参照链接res50网络结构

文中的主干网络是ResNet-50,但其实整体架构就是I3D,没有任何大的改动点,唯一的改动点在于快网络流上,将每个通道数都减小了一半,使得整体模型更加轻量也更容易训练。这里的下划线指该层卷积是非退化的,并不对图像size做出任何改变。

接下来值得一说的地方就是之前提到的,慢速网络和快速网络在处理时会有一个侧向的fusion作(Lateral connections),这个操作是从快速融合到慢速(也许这么做的原因是因为慢速相对于快速的融合的信息量少很多,导致慢到块的融合没啥意义),作者总结了如下三种fusion方式:

  1. 时间方向转通道方向;将快网络流的$\{ \alpha T,S^2, \beta C \}矩阵$(这个地方可能不太好想,毕竟是四维张量,可见图3的展示)中的$\alpha$个时间帧全部拼接到慢网络流的通道方向,此时,慢网络流变成$\{ T, S^2, \alpha\beta C\}$
  2. 时间跨步采样;说白就是通过采样的办法舍弃掉快网络流多出来的那一部分时间帧,它将快网络流从$\{ \alpha T,S^2, \beta C \}$变成$\{ T, S^2, \beta C\}$
  3. 时间跨步卷积;通过一个$stride=5$的卷积核,将快网络流下采样到$\{ T, S^2, \beta C\}$

那么输出的这部分东西自然就简单的和慢网络流输出通过求和或者是串联在一起即可。

混合模式

图3.高维张量示意图

那其它就没什么好说的了,直接看看结果如何,最关心的一应该就是上述的三种fusion方式哪个更好用了,上图对比:

混合模式

图4.超参数选择与不同fusion操作的结果对比

结果一部分意料之内,但也有一部分出乎意料,首先就是三种fusion方式,卷积毫无意外的胜出了,但在快网络流该输入什么上,灰度图与RGB居然不分胜负,考虑到计算开销,说不定灰度图的输入更加优秀!

视频理解论文串讲——上(跟着李沐学ai视频)笔记


深度学习应用于大部分场景下其实就是一个将人类可理解的具体事物转换为可被计算的特征,从而利用各种数学工具完成分类,检测,重构等任务。在图像领域,卷积操作自从Alex net网络架构提出后成为了提取图像特征的一般手段,而对于视频而言,也只是多帧图像组合在一起而已,很自然的能想到使用卷积对视频进行特征的提取,但由于多出了一个时序维度,这使得传统的2D卷积核在提取特征上出现了很多种方法能够进行实验,Deep Video网络架构率先对这个方向进行了探索,并给出了相关的实验结论

混合模式

图1.Fusion的几种模式

图一中,这篇论文将视频中各帧图像的特征融合的方式称之为Fusion,并总结出了四种Fusion方法:

  • Single Frame,顾名思义就是只对单帧图片使用卷积进行编码(图一中由灰色框到彩色框过程),并在卷积层后接入一个MLP层完成分类任务。毫无疑问,这种方法并未利用时间信息,本质上就是单张图片识别,但这是一个baseline,奠定了主要的特征抽取方式
  • Late Fusion,在 Single Frame 的基础上随机间隔的抽取几帧,分别对这些图像帧进行卷积操作提取特征,之后将这些特征送了一个两层全连接层进行特征混合。这种方法使得时序上的特征信息能够在最后的全连接层进行一个交互,某种意义上利用了时序信息。
  • Early Fusion,该方法被称之为 Early ,那相对的对时序特征的融合操作做的就比较早了,它将连续的几帧图像帧在 channel 方向上拼起来,之后使用3d卷积核对这几帧图像提取特征,同样的,在最后送入全连接层进行分类等任务,举个具体的例子:比如三张存在rgb channels的图像拼起来,按照图像宽,高,channel数来划分x,y,z轴,则在z轴上有3*3,共9个矩阵,之后使用x*y*9的卷积核对这三张图像进行特征提取。
    对于这种方法而言,在早期的卷积操作中就对特征进行了提取,本质上是一种3D卷积核的思想。
  • Slow Fusion,这种Fusion方式结合了Late Fsion与Eearly Fusion两种方法的操作,不仅在卷积阶段就对连续帧的图像进行了Fusion操作,并在经过若干卷积操作后就对特征再进行一次Fusion操作(Late Fusion),与真正的Late Fusion不同,Slow Fusion并没有选择直接将多帧特征直接接入MLP层,这是合理的,因为帧数较少时,MLP层的参数规模还在接受范围内,一旦帧数过多,那么参数规模将倍数增长,显然不适合用于长视频帧记忆

值得思考的是,上述几种模式从理论角度上而言,Slow Fusion的效果应该是最好的,但实际上这几种模式的效果大差不差,非要说的话,Slow Fusion的效果确实相对较好,但这几种模式居然都比不过手工提取特征,这是一件很费解的事情,单纯的三维卷积也许学不到时序特征?还是说对于时序特征,卷积的参数量已经不足以满足了?

混合模式

图2.伪双流网络结构

论文中还提到一种特殊的网络架构,这个网络架构很有意思,既带着点注意力机制的感觉,又带着点后来的双流网络的雏形,我将它称之为为双流结构。
如图二,最上面的fovea stream(中央凹流),它将一整张图片扣下来最中间的一部分输入网络中,下面的context stream(上下文流)将整张图片送入网络,作者认为图像最中间总是包含着更多的信息,因此这个结构理应能够更加敏感的注意到视频的变化,从而提升网络性能。实际上网络也确实因为这个改动提升了,这更像是一个早期的注意力机制,只不过注意的范围永远在中间,相当于将中间的信息重复利用了。

上述论文做出的工作最好也只有65%左右的识别率,效果连手工提取特征都不如,但这篇文章将所有能直接应用的工作都做了一遍,是一个很棒的尝试。

Two-Stream


上文讲到,提出Deep Video的论文率先使用了一种伪双流结构对视频进行特征提取,而这篇论文算是正式提出了Two-Stream网络架构,这种网络试图从两个维度:时间-空间,对视频进行特征提取,其模型架构图如图:

混合模式

图3.时空双流网络结构

  • 时空双流网络架构是一个典型的Two-Stage的网络架构,在第一阶段,需要使用光流算法对视频提取光流图(论文在后面还讨论了怎么提取光流特征更好),在第二阶段,将一帧图片送入空间流,并将对应该帧的某一时间段内的几张光流图组成三维张量送入时间流,并应用Deep Video中提出的Late Fusion思想,将特征送入MLP中学习一种分类的映射。
  • 必须注意的是,虽然在我们理解中,这个网络学习了空间信息与时间信息,但实际上这个网络并没有学习真正意义上的时间信息,而是通过将视频转为光流图像的方式去让网络学习光流特征,从而间接学到时间特征
  • 这个架构优秀的地方在于提出了独立学习特征的概念,某种意义上也算是启发了后来的多模态工作,并且该模型存在极大的改进空间,论文中直接使用的是Late Fusion,但从理论角度上来说Slow Fusion的性能更加优越。并且一旦引入Slow Fusion,两个独立工作的Stream就能在学习中互相交换信息,这更加符合我们人类的直觉

这篇文章主要在于提出了影响后续很久的双流网络架构,但这种架构理论上是能够提取小范围的时序特征,但是人的动作,或者一个事件的发生,动辄1-2s,长的更是达到3-5s,按照1s有30帧图像来算,即使使用抽帧技术,想要精确识别长动作或长事件,对时序流网络的参数量要求也是指数级的飙升,这也为后续工作提供了一个研究方向。

C3D——时间方向上也能移动的卷积核


上述提到的两种网络均基于2D卷积神经网络,Two-Stream架构使用2d卷积核捕捉空间信息和光流信息,Deep Video试图使用特征混合的方式用2d卷积核提取时间与空间信息,但毫无疑问的是这两种架构都没能真正的提取时间信息(Two-Stream看似提取了时间信息,但其实是学习了光流图信息,本质上是一个多模态输入),C3D论文很自然的提出2D卷积的无法提取,若是能够让卷积核在时间轴上移动,是否能够提取时间信息?

混合模式

图4.2D卷积与3D卷积的区别

  • 图4(a)中,单通道的2D卷积核在图像的宽高两个方向上进行移动,并最后输出一张2D特征图
  • 图4(b)中,对于带有通道(RGB)的图像或视频,2D卷积也会多出一个维度将通道信息或时间轴信息一起卷起来,但是无一例外最后也是输出一张特征图。这里为了避免误导,特意说明:一般的卷积操作普遍被认为只会学习一种特征,因此对于一张图的卷积操作是同时有n个卷积核同时提取特征,每个特征都尽不相同,但是每个卷积核仍旧只是提取一张特征图,最后的输出是将n张卷积核提取的n张特征图堆叠起来,所以看起来像是2D卷积核提取出了一个3D张量的特征图。特此说明以防与图4(c)混淆。
  • 图4(c)中,对于视频信息,使用一个k*k*d的3D卷积核,该卷积核不仅在图像帧的宽高方向移动,还会在时间轴上进行移动,并且对于一个卷积核而言,它的输出为一个3阶张量。

论文认为,2D卷积核之所以效果不够好,是因为2D卷积核把时间信息当作通道特征提取了,这应该是两种不同模态的特征,并且2D卷积核最后将特征输出为一张2D特征图,这对于时间特征来说是一种破坏,时间本应该描述为一种变化过程,但2D卷积将这种变化压缩降维到了一张图上,破坏了这种变化特征。而3D卷积核则没有这个问题,它并未折叠时间特征,而是将这种特征很好的保存了下来。作者的想法并未空穴来风,实际上该方法相较于其他使用2D卷积核的方法进步将近10个点,并且作者为这种方法做出了很好的解释:

混合模式

图5.3D卷积卷了些什么

  • 作者使用了deconvolution的方法展示了3D卷积核里面的东西,可以看到,前几帧的图像中,卷积核被大幅度激活,捕获了图像的空间信息,之后的时间特征中,卷积核只对运动幅度较大的事件(体操动作)表现出了明显的激活现象,而对于运动幅度不大的事件(化妆)基本不激活

这篇论文还做了很多的消融实验,并且为3D卷积核为什么有用给出了极为详细的解释,包括3D卷积核映射出的特征的性质等,但是缺点也是很明显的:计算量取决于视频的长度,而回到了之前Two-Stream架构的问题,一秒就有30帧, 假设对一个长为5秒,大小为224224的视频进行计算,以3\3*3,stirde为1的3D卷积核为例,那么一次卷积操作就要移动223*223*1499次,而相同条件下的一次2D卷积核只需要移动223*223次,这是极大的计算量差距。短视频剪辑可以接受,长视频几乎是不可能完成的任务。

超越短时间的视频建模——引入LSTM的深度网络


前文说到,对于长时间视频建模而言,现有方法基本无法逃开计算量爆炸的问题,为了解决这个问题,本篇论文的作者顺势引入了LSTM网络解决这个问题。并在这篇文章中实验了Deep Video中提到的大部分fusion操作,实际验证了使用简单的max-pooling作为Early-fusion的手段,效果是最好的,当然个人认为有点无法解释,这可能变相说明了2D卷积的fusion操作无法在视频理解领域起到很好的作用。

混合模式

图6.模型架构概览

  • 接下来从两个方面对整体架构进行解读:
    • 首先在视频预处理阶段,对视频进行抽帧处理,这里由于作者打算采用一种多模态的思想(一个网络流中同时输入图片数据与光流数据),可以接受原数据损失较大的动作信息(对应图中每个视频帧都不一样的表示),所以采用了一秒仅采样一帧的方法,而光流图作为对动作信息的补足,作者选取两个相邻帧(已被抽过帧)以15fps的采样速率从原始视频帧中采样并计算光流图(使用TV-L1算法,这里存疑,需要了解该算法),得到的光流图则当作视频图像特征送进卷积网络
      这里作者提到一个预训练技巧,对光流图的卷积没必要重新训练,使用图像那边训练的好的卷积即可,这样能够加快模型的收敛速度,推测因为原始图像中的边缘信息有利于提取光流信息。原文还提到,一帧RGB图像对应横纵两个方向的光流图,因此可以补一个0通道矩阵给光流图,以满足在图像卷积模型上进行训练的要求。
  • 其次Feature-Aggregation阶段,在这个阶段中,作者提出了两个方法,一个使用Feature-Pooling的方法,顾名思义就是用Pooling操作去进行时序方向上卷积特征的融合。另一个则是使用LSTM网络去aggregate时序信息

接下有关Feature-Pooling方法的几种形式不打算过多介绍,这几种方法的提升都很有限,并且无论叠了多少杂七杂八的层,最后效果最好的居然是最简单的conv-pooling方法,因此这里就简单介绍一下conv-pooling:

混合模式

图7.Conv-Pooling(左一)

  • 如图所示,模型将卷积特征输入一个max-pooling层,之后对特征做全连接操作。这个架构只有一个地方需要注意,那就是max-pooling的移动方向应该是时域方向,而非空间方向。有意思的是这个操作为什么有用,它甚至是所有作者尝试的操作中最有用的一个,甚至比LSTM都好!笔者想不到解释的原因吗,就不做过多猜想了。

接下来,作者将LSTM引入了视频领域,帮助科研界排除了LSTM这一选项(它的效果甚至不如简单的pooling操作,可以理解为时序信息在这里发生了严重的退化),具体过程如图:

混合模式

图8. LSTM操作

  • 图中的蓝色小方块代表一个LSTM神经元,这里每个神经元同时负责向上与向前传播的任务,这里的输入时卷积后的特征,这里的特征应该是拉平后输入的。

这篇论文的主要工作就是引入了LSTM与普通的Pooling操作,并且对比了这些工作的效果,最后的结论也是很意外的,LSTM并没有为网络带来质的改变,在nlp领域工作的很好的网络在视频领域工作得居然如此差劲,反而是简单的pooling操作能够融合更多的时序信息。这是一篇很好的试错文章,想使用LSTM在视频领域的兄弟们可以洗洗睡了,目前看效果并不好,这是一块并不好摘的果实,我们可能需要更优秀的特征编码技术才能引入LSTM。

使用Convolution Fusion的视频动作识别双流网络


本篇论文探索了关于Early fusion在双流网络结构中的应用,作者提出:双流网络的Late Fusion并不能很好的总结信息,这是因为对于一个动作时间而言,有些是能够根据空间信息(例如喝水,打球)是可以仅通过单帧图像就能识别的,但是对于另一些动作(例如说话,化妆,车辆行驶)等是需要空间与时间线索一起来确定,而双流网络的Late Fusion是在高语义阶段才做出融合操作,在低语义阶段并没有关注一些很明显的时间线索信息。这里补充语义特征的一点知识,目前学界广泛认为低级语义信息往往是一些很基础的诸如色彩,轮廓,线条等信息。而高级语义信息通常关注的是人类能够理解的图案(会丢失细节,丢失程度往往取决于低级语义信息)。

因此作者认为需要在低级语义阶段就让两个时空信息进行融合(Early Fusion),并且一个动作的时间信息与空间信息应该是高度相关的,应该尽可能逐像素的进行关联。

作者提出了4中fusion操作,并一一解释了它们为何能够有效,以下公式中,$x^a_{i,j,d}$表示$a$特征图,$i,j,d$分别表示特征图的长,宽以及通道数:

$y^{sum}_{i,j,d}=x_{i,j,d}^a+x_{i,j,d}^b$

  • 简单来说就是把时空特征图逐像素,逐通道的加起来,通过学习参数得到一种时间与空间对应的计算关系

$y^{max}=max\{x_{i,j,d}^a, x^b_{i,j,d}\}$

  • 这是一个类似max-pooling的机制,将特征图逐像素的对比,保留最大的特征值,这种方法可以说学习了一种时间与空间的价值性,学习了一种该特征点上空间重要就保留空间,时间重要就保留时间的机制

$y^{cat}_{i,j,2d}=f^{cat}(x^a,x^b)$

  • 这种fusion一般与conv fusion混用,它简单的把特征在通道($d$)方向上堆叠起来,之后使用conv fusion提取特征

$y^{conv}=y^{cat}*f+b$

  • 这里的 $f$ 是一次卷积操作,根据论文作者的实验,这种fusion的效果是最好的,这很好解释,已知卷积能够有效提取特征,那么这种方式理应是最好的才对

$y^{bil}=\sum^H_{i=1}\sum^W_{j=1}x_{i,j,d}^{aT}x^b_{i,j,d}$

  • 这个操作将某个像素点上空间特征图的通道向量和时间特征图的通道向量做一个外积操作,并将其加权平均了一下。这个运算复杂度极高,事实上作者最后证明了这个操作的效率提升并不高只要做conv-pooling即可。

明确了这些fusion操作后,作者探索了两种做fusion操作的时机并给出了模型的整体框架图

混合模式

图9. 模型框架探索

作者使用了VGG网络框架,在左图中,用两个网络架构进行特征图提取,于conv4层进行了一次时空特征图融合之后再用卷积提取一次高级语义特征后送入全连接层。在右图中,两个网络架构分别提取时间与光流特征,于conv5层进行了一次时空特征融合,不同的是空间网络流并没有消失,而是继续向前送入全连接层,在最后进行一次最后的融合输出分类信息。

从形式上看,左图就是由原来的双流网络进行一次fusion操作,之后接入了一次卷积网络,单纯从参数量上来评价网络性能的话,左图架构相比传统双流网络要少将近一半的参数。

而右图仍旧是一个完整的双流网络架构,并且因为中间的fusion操作,参数相比传统双流架构要更多一些。

右图相比左图而言,除了在参数量上有区别,更加注重保留空间上的高级语义信息,它不单在低级语义信息信息上进行了一次特征融合,在高级语义信息上又进行了一次融合。理所应当的,右图的性能表现要优于左图,事实上,根据原文中的表五数据来看,右图架构确实比左图架构要好将近一个点。

作者又认为,在时空融合后需要另外对时间流进行具体额外的处理,并且这种处理必须严格的考虑时序上的信息,因此作者对比了学界主流的几种时序特征的融合方式:

混合模式

图10. 三种时序fusion操作

  • (a)图很明显是完全没有利用时序信息
  • (b)图将时序特征堆叠起来,使用3D-pooling操作进行特征聚合操作,这个操作将时序信息进行了一次增强
  • (c)图使用了一次3D卷积提取特征,这里要注意(c)与(b)的差异,单纯的pooling操作一定是对已经提取好的特征做的,也就是输入数据包含了某种可解释的一致性。而卷积+pooing的操作是对存在非一致性的输入数据做的,换句话说,(c)是一个特征提取模块,这个模块具备捕捉时序信息的能力。

之后作者就结合以上讨论给出了最终的网络架构:

混合模式

图11. 模型整体架构

该模型架构可以看作图9(左)中的扩展(这里我认为也可以看作是对图9(右)的改进),与之不同的是图9(左)中将两个特征流合并为一个特征流,少了一半的参数量,而该框架中注重时间流(依据为作者所做实验,对比之下注重时间流的效果更加优秀,这也是为什么我认为是对图9(右)的改进),接下来从三个模块阐明该架构:

  • 在时空流阶段,网络分别提取光流特征与空间特征流,其中光流特征提取当前 $t$ 时刻的前后 $\frac L2$ 个时刻的光流图作为输入。在fusion阶段,采用上文说过的3D-conv-pooling操作,将两个不同信息的特征流Concatenate后提取为一个具有时空信息的特征流,之后使用3D-pooling操作增强特征

  • 时空合并后阶段,时间特征流并未随着特征流的合并而消失,而是继续前进,在接入全连接层前使用3D-pooling减小特征数据量并同时增强特征数据

  • 输出loss阶段,注意到时空流会输出一个Spatiotemporal-Loss,而单纯时序流会输出一个Temporal-Loss,为了使loss能够正常优化,作者对两个loss进行了加权平均后输出为一个loss

作者为双流网络构建了一种能够进行Early-fusion的架构,提出一种逐像素对应时间与空间关系的fusion方法,其中结合了3D-convolution与3D-Pooling操作,这种架构在没有显著增加参数量,使用两个基准数据集的情况下,超过了当时最好的技术。

研究表明了时间特征与空间特征在高度抽象的特征阶段(低级语义信息阶段)需要一一对应。此外作者还发现如果使用手工抽取的特征与卷积网络预测结合的话,也有类似改进效果,变相说明了这种时空特征意义对应的重要性.

作者在论文中设计了大量的消融实验,探索了应该在第几个卷积层实现这种fusion操作;应该增强空间特征流的提取还是增加时间特征流的提取,还是说都不增加,直接Late-fusion;各种fusion操作究竟哪个更好等等,上上下下的探索了整个双流网络,并大胆使用了3D卷积核与3D-Pooling操作,更有力证明了这种操作的有效性。

TSN——超级有效的视频分段建模


本篇论文提供了两个主要贡献点,其一是TSN(时间段分割网络),该架构可以实现长时间结构视频的建模,它结合了稀疏时间点采样与视频有监督训练,使得在视频动作识别上取得了良好效果。第二个贡献就是研究了于TSN帮助下在视频数据上学习卷积网络的一系列实践(就是帮忙排了雷)。

整个TSN分为四个阶段,接下来就从这四个阶段一一阐述该模型:

混合模式

图12. TSN模型整体架构

  • 第一阶段输入一个的视频,将视频分成几个大段,随后从每个分段中随机抽取一个短分段(其实就是一帧),抽出来帧将其转换为空间流(帧本身)与时间流(相应的光流图)作为下一阶段的输入

  • 第二阶段为一个典型的双流网络,注意,这里每一帧对应双流网络的权值均为共享的,所以看似有很多,实质上只有一个。网络输出的就是分类的编码(独热编码等)

  • 第三阶段是一个很有争议的阶段,它将上一阶段的分类结果输入两个一致性计算模块进行计算(空间流和空间流进行计算,时间流与时间流进行计算),但一致性计算的形式并不确定,作者给不出解释,反正他们把想到的加加减减,取平均等的聚合函数操作试了一下(这不是我瞎说的啊,作者原文就有这句话:The form of consensus function G remains an open question.),最后实验结果是取平均这种方法的效率更高点,倒也蛮符合直觉的,这里最后的输出也是一个分类的独热编码

  • 第四阶段将两个一致性模块输出的分类编码综合考虑最后的预测,这里作者直接采用softmax函数。

这里试图解释一下这个分段的本质是什么,这里给出的数据集就是一个长时间的动作视频,分段其实就是一种稀疏采样的策略,采样得到的每个时期的帧都是属于这个动作的一部分,形式化讲的话,采样得到的样本都是属于同一个概率分布,稀疏采样更有利于模型全面了解整个概率分布。

另外,这个模型在训练时还有很多的细节可以讨论,作者也在接下来补充了很多训练时能用到的技巧:

混合模式

图13. 几种视频帧的代替输入方案

  • 作者提到对于单帧输入的图像往往缺乏上下帧的时间信息,普通光流图可能并不会把注意力放在运动的主要目标上(例如背景同时存在大量相对位移的情况下),作者找到了另外两种输入方式:RGB图像差分图,扭曲光流图。为了对比怎样的输入更优秀,做了几个消融实验,最终得出结论:这四种方法一起输入的效果是最好的,RGB差分图的效果较差,但比单纯出输入RGB要好。倒是不意外,这也意味着RGB差分图在实时应用领域能够代替计算量较大的光流图。

  • 交叉模型训练,在预训练阶段中,作者利用RGB模型初始化光流模型(RGB模型可以通过其他分类模型预训练得到),其操作过程如下:

    • 使用线性变换将光流图数值从0-1变换到0-255
    • 利用RGB模型的第一层卷积层参数来初始化光流卷积网络第一层的卷积参数,但有一个问题,光流图像有两个channel(x方向与y方向),若依次输入10张光流图,那么就有20个channel,而一个RGB图像只有3个channel,如何将3个channel变成20个channel?作者直接将RGB三个channel的参数做了一下平均合成一个channel的参数,之后将这个channel复制20个当作光流网络的20个channel参数,效果异常优秀!
  • 正则化技巧,这里讲的就是Batch-Normalization这个层的使用技巧了,这个层在使用好的情况下是可以很好的改进网络的性能,不好的情况下就会出各种问题。尤其在视频领域,由于数据集太小,因此会出现过拟合现象,作者提出Partial-BN的概念:

    • 由于数据集较小,BN层微调会出现过拟合现象,那第一想法就是冻起来不调了,那这样迁移学习的效果的可能就不会太好。
    • 作者认为,光流数据与RGB数据是不同模态的输入,数据的分布在一开始肯定是不同的,因此第一层的BN微调是有必要的(虽然我觉得后面也应该是不同的),所以作者就冻结了除第一层BN参数外的所有其它参数
    • 同时,作者为了进一步防止过拟合,在每一层池化层后加入了一个额外的Dropout层
  • 数据增强,作者提出了两种数据增强的方式:

    • 角裁剪(corner cropping):仅从图片的边角或中心提取区域,来避免默认关注图片的中心
    • 尺度抖动(scale jittering):将输入图像或者光流场的大小固定为 256×340,裁剪区域的宽和高随机从 {256,224,192,168} 中选择。最终,这些裁剪区域将会被resize到224×224 用于网络训练。事实上,这种方法不光包括了尺度抖动,还包括了宽高比抖动

本篇论文提出的TSN框架,将视频分段建模的思想很有用,视频种提到可以将这种思想用到对比学习(contrast learning)中


总结


本笔记涵盖了总共6篇在视频领域发挥代表性作用的论文,结合视频内容与自身理解进行记录,前前后后的整理花了大概10天时间,学到了不少东西,也明白了前辈们的工作是如何艰辛。

到目前为止,卷积网络的路似乎已经走到了尽头,Transfomer的崛起注定了卷积操作的落寞,但在Transfomer的应用中必定会出现不少与卷积网络相同的问题,相信研究前人的论文,一定能找到对应的解决方法。